<?
require_once 'MainPageWidget.php';
class HotDocumentWidget extends MainPageWidget {

	private $imgMaxWidth = 100;
	private $imgMaxHeight = 100;

	public function Render() {
		$this->title = $this->getParam("title");
		$this->anonce = $this->getParam("anonce");
		//получим документ
		$docId = $this->getParam("document", -1);
		if($docId != -1) {
			$model = $this->ctx->mm->getModel("Item", "m");
			$doc = $model->getItem($docId);
			$this->doc_data = $doc->data;
			//пользователь
			$uModel = $this->ctx->mm->getModel("User", "m");
			$user = $uModel->getUser($doc->data['posted_by_id']);
			$this->user_full_name = $user->data['fullname'];
			//кол-во комментов
			$cModel = $this->ctx->mm->getModel("FlatComments", "m");
			$this->comments_count = $cModel->commentsCount($docId);
			//ссылка на документ
			$this->ctx->rh->UseClass('RL_URLGenerator');
			$ug = new RL_URLGenerator($this->ctx->rh->router->getRule("showitem"));
			$ug->setRouter($this->ctx->rh->router);
			$ug->setParams(array(
				"community_url"	=> $this->params['community_url'],
				"id_item"		=> $docId,
			));
			//var_dump($ug->generateUrl());
			$this->doc_url = $ug->generateUrl();
			//логотипчик
			if($imgId = $this->getParam("image_oid")) {
				$this->image_src = "/imagestorage/".$imgId."/orig";
				$this->image_oid = $imgId;
				//*post.image_oid | link_to 'imagestorage'
			}
		}else
			$this->tdi_not_found = 1;

		return $this;
	}

	public function settingsForm()
	{
		//типы документов
		$typesList = $this->getTypes();
		$selType = $this->getParam("types",-1);

		if($selType != -1) {
			$docs = $this->getDocs($selType);
			$docsList = array();
			$count = count($docs);
			for($i=0; $i<$count; $i++) {
				$docsList[$docs[$i]['oid']] = $docs[$i]['title'];
			}
		}else
			$docsList = array(-1=>' Выберите раздел ');

		$config['form'] = array(
			'title' => 'Настройка меню',
			'fields' => array(

				'title' => array(
					'type' => 'text',
					'title' => 'Название',
					'default' => $this->getParam("title"),
					'description' => 'Отображаемый заголовок',
				),

				'anonce' => array(
					'type' => 'textarea',
					'title' => 'Ананс',
					'default' => $this->getParam("anonce"),
					'description' => 'Краткое описание',
				),

				'types' => array(
					'type' => 'select',
					'title' => 'Тип документа',
					'description' => 'Тип документа',
					'options' => $typesList,
					'value'	=> $selType,
				),

				'document' => array(
					'type' => 'select',
					'title' => 'Документ',
					'description' => 'Документ',
					'options' => $docsList,
					'value'	=> $this->getParam('document',-1),
				),
			),
		);
		// HACK: назначаем iframe адрес, иммитирующий AJAX запрос
		/*
		$config['iframe_url'] = "/".$this->params['community_url']."/ajax?".
			"cpaint_function=ajax_execWidget&cpaint_argument[]=".$this->widget_id."&".
			"cpaint_argument[]=ajax_GetImageConent&".
			"cpaint_response_type=OBJECT";
		*/
		$config['form']['iframe_url'] = $this->rh->base_url.$this->params['community_url']."/ajax?".
			"cpaint_function=ajax_execWidget&cpaint_argument[]=".$this->widget_id."&".
			"cpaint_argument[]=ajax_GetImageConent&".
			"cpaint_response_type=OBJECT";

		return $config['form'];
	}

	private function getTypes() {
		$typesList = array(
			array('value'=>'-1','title'=>'Выберите раздел','')
		);
		$types = $this->ctx->doctypes;
		foreach ($types as $typeName=>$typeParams) {
			$typesList[] = array(
				'value'	=> $typeName,
				'title'	=> $typeParams['typename'],
			);
		}

		return $typesList;
	}

	private function getDocs($docType) {
		$community_oid = $this->acl_assistant->acl_data['comity_oid'];

		$sql = "
			SELECT
			afeed.title as title,
			afeed.oid as oid
			FROM  store_objects       AS objs
			INNER JOIN store_class_allfeed AS afeed ON afeed.oid = objs.oid
			        AND afeed.is_deleted = 0 AND afeed.community_oid = ".$community_oid."
			INNER JOIN t_acl_tree tat ON tat.id_object =  objs.oid  AND tat.is_deleted = 0
			WHERE  objs.type='f".$docType."'
			ORDER BY objs.ctime DESC
			LIMIT 30";

		//$ors = new DBStoreResult($this->store,$this->store->query($sql));
		$data = $this->ctx->db->query($sql);

		return $data;
	}

	public function ajax_GetDocs($docType) {
		$data = $this->getDocs($docType);
		$count = count($data);
		$items = array();

		for($i=0; $i<$count; $i++) {
			$items["item_".$i] = $data[$i];
		}

		return array('items'=>$items, 'items_count'=>$count);
	}

	public function ajax_GetImageConent() {
		$view = $this->ctx->rh->views->findByName('WG_HotDocumentWidget:image');

		if(is_array($_FILES['img_file'])) {
			try {
				$this->uploadImage($_FILES['img_file']);
			}catch (Exception $ex) {
				$view->data['error'] = $ex->getMessage();
			}
		}
		if($_POST['del_img']) {
			$this->removeImage();
		}

		$imgId = $this->getParam("image_oid");
		if($imgId) {
			$view->data['is_image'] = true;
		}
		$view->data['image_id'] = $imgId;
		//HACK: тупо эхом выводим контент и прерываем выполнение скрипт
		echo $view->getContent();
		exit;
	}

	private function uploadImage($postData) {
		if($postData['error'])
			throw new Exception("Ошибка загрузки файла");

		$imgData = getimagesize($postData['tmp_name']);
		if($imgData === false)
			throw new Exception("Загружаемый файл не является изображением");
		//маскимальный размер
		if($imgData[0]>$this->imgMaxWidth || $imgData[1]>$this->imgMaxHeight)
			throw new Exception("Максимальный размер изображения: ".
				$this->imgMaxWidth." x ".$this->imgMaxHeight);
		//разрешенные типы
		$allowTypes = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
		if(!in_array($imgData[2], $allowTypes))
			throw new Exception("Допустимые форматы изображения: gif, jpeg, png.");
		//все проверка прошли, создаем сторейдж
		$this->ctx->rh->UseClass('stores_ImageStorage');
		$storage = new ImageStorage( &$this->ctx->rh->ctx->store );
		//если картинка существует - удалить её
		if(($oldId = $this->getParam("image_oid"))!==null) {
			$storage->Del($oldId);
		}
		//загрузка
		$sizes = array( //только оригинал
			'orig' => array(
				'filter' => 'pass',
				'clone' => false,
			),
		);
		$imageOid = $storage->Put($postData['tmp_name'],$sizes);
		//сохраняем в настройки виджета, на случай если
		//юзер нажмет отмену. Если этого не сделать, картинка будет
		//загружена, но на ней не будет никаких ссылок
		$cc = $this->acl_assistant->getInfo();
		$cid = $cc['comity_oid'];
		$model = $this->ctx->mm->getModel("Community","m");
		$config = $model->getConfig($cid);
		$config['widgets'][$this->widget_id]['params']['image_oid'] = $imageOid;
		$model->saveConfig($cid, $config);
		//для отображения ответа
		$this->setParam("image_oid", $imageOid);
	}

	private function removeImage() {
		if(($oldId = $this->getParam("image_oid"))!==null) {
			$this->ctx->rh->UseClass('stores_ImageStorage');
			$storage = new ImageStorage( &$this->ctx->rh->ctx->store );
			$storage->Del($oldId);
			//сохраняем в настройки виджета	на случай если
			//юзер нажмет отмену. Если этого не сделать,
			//виджет будет ссыгаться на несуществующую картинку
			$cc = $this->acl_assistant->getInfo();
			$cid = $cc['comity_oid'];
			$model = $this->ctx->mm->getModel("Community","m");
			$config = $model->getConfig($cid);
			unset($config['widgets'][$this->widget_id]['params']['image_oid']);
			$model->saveConfig($cid, $config);

			$this->setParam("image_oid", null);
		}
	}
}
